package service.center.message;

import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class 易源天气 {

    private  static HttpHeaders 请求头 = new HttpHeaders();
    private  static RestTemplate 访问请求体 = new RestTemplate();

    private static String appcode;

    @Value("${appcode}")
    public void setAppcode(String appcode) {
        this.appcode=appcode;
    }

    private static  String 基本请求(String 接口, HttpHeaders 请求头){
        请求头.add("Authorization", "APPCODE " + appcode);
        String host = "http://saweather.market.alicloudapi.com";
        HttpEntity<Resource> 请求实体 = new HttpEntity<Resource>(请求头);
        //使用 exchange 请求，返回请求头，请求体等
        ResponseEntity<String> 请求返回 = 访问请求体.exchange(host + 接口, HttpMethod.GET, 请求实体, String.class);
        请求头.clear();
        return  请求返回.getBody();
    }

    //根据地名查询城市id，同名城市会查出多个
    public static String 查询地名对应id(String 地名) {
        String path = "/area-to-id";
        请求头.add("area", 地名);
        return  基本请求(path,请求头);
    }

    //根据地名或城市id均可查询24小时预报
    public static String 查询24小时预报(String 地名) {
        String path = "/hour24";
        //判断是area 地区名称 还是 areaid 地区id
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(地名);
        if( isNum.matches() ){
            请求头.add("areaid", 地名);
        }else{
            请求头.add("area", 地名);
        }
        return  基本请求(path,请求头);
    }

    //查询7天预报，需要天气预警，需要返回指数数据
    public static String 查询7天预报(String 地名) {
        String path = "/area-to-weather";
        //判断是area 地区名称 还是 areaid 地区id
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(地名);
        if( isNum.matches() ){
            请求头.add("areaid", 地名);
        }else{
            请求头.add("area", 地名);
        }
        请求头.add("need3HourForcast", "0");//是否需要每小时数据的累积数组。1为需要 0为不
        请求头.add("needAlarm", "1");//是否需要天气预警。1为需要，0为不需要。
        请求头.add("needHourData", "0");//是否需要每小时数据的累积数组。1为需要 0为不
        请求头.add("needIndex", "1");//是否需要返回指数数据。1为需要，0为不需要。
        请求头.add("needMoreDay", "0");//是否需要返回7天数据中的后4天。1为返回，0为不
        return  基本请求(path,请求头);
    }

    //根据地名或城市id均可查询15天预报
    public static String 查询15天预报(String 地名) {
        String path = "/day15";
        //判断是area 地区名称 还是 areaid 地区id
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(地名);
        if( isNum.matches() ){
            请求头.add("areaid", 地名);
        }else{
            请求头.add("area", 地名);
        }
        return  基本请求(path,请求头);
    }

    //经纬度查天气,121.509016,31.141861 上海
    public static String 经纬度查天气(String 经度值,String 纬度值) {
        String path = "/gps-to-weather";
        请求头.add("from", "5");//输入的坐标类型, 5：百度地图采用的经纬度坐标
        //http://api.map.baidu.com/lbsapi/getpoint/index.html  ,
        请求头.add("lat", 纬度值);//纬度值
        请求头.add("lng", 经度值);//经度值
        请求头.add("need3HourForcast", "0");//是否需要当天每3/6小时一次的天气预报列表。1为需要，0为不需要。
        请求头.add("needAlarm", "1");//是否需要天气预警。1为需要，0为不需要。
        请求头.add("needHourData", "0");//是否需要每小时数据的累积数组。1为需要，0为不需要。
        请求头.add("needIndex", "1");//是否需要返回指数数据。1为需要，0为不需要。
        请求头.add("needMoreDay", "0");//是否需要返回7天数据中的后4天。1为返回，0为不返回。

        return  基本请求(path,请求头);}

        //经纬度查天气解析
        public static String 经纬度查天气解析(String 经纬天气,String 称呼) {
            Gson gson = new Gson();
            LinkedTreeMap 天气详情 = (LinkedTreeMap) gson.fromJson(经纬天气, HashMap.class).get("showapi_res_body");
            //当前信息
            String 当前温度= (String) ((LinkedTreeMap)天气详情.get("now")).get("temperature");
            String 当前天气= (String) ((LinkedTreeMap)天气详情.get("now")).get("weather");
            String 当前降雨= (String) ((LinkedTreeMap)天气详情.get("now")).get("rain");
            //当天信息
            String 当天温度差=  ((LinkedTreeMap)天气详情.get("f1")).get("night_air_temperature")+"度到"
                    +((LinkedTreeMap)天气详情.get("f1")).get("day_air_temperature")+"度，";
            String 当天天气差= ((LinkedTreeMap)天气详情.get("f1")).get("day_weather")+"转"
                    +((LinkedTreeMap)天气详情.get("f1")).get("night_weather")+",";
            String 当天降雨="降雨概率"+ ((LinkedTreeMap)天气详情.get("f1")).get("jiangshui");
            //指数数据 提醒
            LinkedTreeMap 指数数据 = (LinkedTreeMap) ((LinkedTreeMap)天气详情.get("f1")).get("index");
            String yh= (String) ((LinkedTreeMap) 指数数据.get("yh")).get("desc");
            String ls= (String) ((LinkedTreeMap) 指数数据.get("ls")).get("desc");
            String clothes= (String) ((LinkedTreeMap) 指数数据.get("clothes")).get("desc");
            String dy= (String) ((LinkedTreeMap) 指数数据.get("dy")).get("desc");
            String sports= (String) ((LinkedTreeMap) 指数数据.get("sports")).get("desc");
            String travel= (String) ((LinkedTreeMap) 指数数据.get("travel")).get("desc");
            String beauty= (String) ((LinkedTreeMap) 指数数据.get("beauty")).get("desc");
            String xq= (String) ((LinkedTreeMap) 指数数据.get("xq")).get("desc");
            String hc= (String) ((LinkedTreeMap) 指数数据.get("hc")).get("desc");
            String zs= (String) ((LinkedTreeMap) 指数数据.get("zs")).get("desc");
            String cold= (String) ((LinkedTreeMap) 指数数据.get("cold")).get("desc");
            String gj= (String) ((LinkedTreeMap) 指数数据.get("gj")).get("desc");
            String uv= (String) ((LinkedTreeMap) 指数数据.get("comfort")).get("desc");
            String comfort= (String) ((LinkedTreeMap) 指数数据.get("comfort")).get("desc");

            String 天气状态status=当天天气差+当天降雨;
            String 天气提醒remark=hc.split("，")[0];
            String 总结提醒mtname="当前"+当前温度+"度，最高最低"+当天温度差;

            HashMap 提醒内容=new HashMap();
            提醒内容.put("name",称呼);
            提醒内容.put("status",天气状态status);
            提醒内容.put("remark",天气提醒remark);
            提醒内容.put("mtname",总结提醒mtname);
            return gson.toJson(提醒内容);
        }

}
